package com.ajaxw.main;

import java.io.IOException;
import java.io.StringReader;
import java.util.Iterator;
import java.util.Set;

import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.KeywordAttribute;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Collector;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.AttributeSource;
import org.apache.lucene.util.Version;

public class Test {

	/**
	 * @param args
	 * @throws IOException
	 * @throws LockObtainFailedException
	 * @throws CorruptIndexException
	 * @throws ParseException
	 */
	public static void main(String[] args) throws CorruptIndexException,
			LockObtainFailedException, IOException, ParseException {
		// TODO Auto-generated method stub
//		String text = "学习 软件交流 开发设计 考试考研 站长网编 竞赛创业 网络服务 科学探索 手机数码 互联网 通信业界 职业 程序人生 IT人物 职场求职 IT幽默 游戏 网页游戏 赛尔号 手机游戏 小花仙 专辑 新浪微博 Windows7 腾讯微博 iPhone 当前位置：首页>挖经验>搜索引擎技术>当前几个主要的Lucene中文分词器的比较 当前几个主要的Lucene中文分词器的比较 作者：唐福林 来源：福林雨 博客 酷勤网收集 2009-08-04 1. 基本介绍： paoding ：Lucene中文分词“庖丁解牛” Paoding Analysisimdict ：imdict智能词典所采用的智能中文分词程序mmseg4j ： 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器ik ：采用了特有的“正向迭代最细粒度切分算法“，多子处理器分析模式 2. 开发者及开发活跃度： paoding ：qieqie.wang， google code 上最后一次代码提交：2008-06-12，svn 版本号 132imdict ：XiaoPingGao， 进入了 lucene contribute，lucene trunk 中 contrib/analyzers/smartcn/ 最后一次提交：2009-07-24，mmseg4j ：chenlb2008，google code 中 2009-08-03 （昨天），版本号 57，log为：mmseg4j-1.7 创建分支ik ：linliangyi2005，google code 中 2009-07-31，版本号 41 3. 用户自定义词库： paoding ：支持不限制个数的用户自定义词库，纯文本格式，一行一词，使用后台线程检测词库的更新，自动编译更新过的词库到二进制版本，并加载imdict ：暂时不支持用户自定义词库。但 原版 ICTCLAS 支持。支持用户自定义 stop wordsmmseg4j ：自带sogou词库，支持名为 wordsxxx.dic， utf8文本格式的用户自定义词库，一行一词。不支持自动检测。 -Dmmseg.dic.pathik ： 支持api级的用户词库加载，和配置级的词库文件指定，无 BOM 的 UTF-8 编码，\r\n 分割。不支持自动检测。 4. 速度（基于官方介绍，非自己测试） paoding ：在PIII 1G内存个人机器上，1秒 可准确分词 100万 汉字imdict ：483.64 (字节/秒)，259517(汉字/秒)mmseg4j ： complex 1200kb/s左右, simple 1900kb/s左右ik ：具有50万字/秒的高速处理能力 5. 算法和代码复杂度 paoding ：svn src 目录一共1.3M，6个properties文件，48个java文件，6895 行。使用不用的 Knife 切不同类型的流，不算很复杂。imdict ：词库 6.7M（这个词库是必须的），src 目录 152k，20个java文件，2399行。使用 ICTCLAS HHMM隐马尔科夫模型，“利用大量语料库的训练来统计汉语词汇的词频和跳转概率，从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分”mmseg4j ： svn src 目录一共 132k，23个java文件，2089行。MMSeg 算法 ，有点复杂。ik ： svn src 目录一共6.6M(词典文件也在里面)，22个java文件，4217行。多子处理器分析，跟paoding类似，歧义分析算法还没有弄明白。 6. 文档 paoding ：几乎无。代码里有一些注释，但因为实现比较复杂，读代码还是有一些难度的。imdict ： 几乎无。 ICTCLAS 也没有详细的文档，HHMM隐马尔科夫模型的数学性太强，不太好理解。mmseg4j ： MMSeg 算法 是英文的，但原理比较简单。实现也比较清晰。ik ： 有一个pdf使用手册，里面有使用示例和配置说明。 7. 其它 paoding ：引入隐喻，设计比较合理。search 1.0 版本就用的这个。主要优势在于原生支持词库更新检测。主要劣势为作者已经不更新甚至不维护了。imdict ：进入了 lucene trunk，原版 ictclas 在各种评测中都有不错的表现，有坚实的理论基础，不是个人山寨。缺点为暂时不支持用户词库。mmseg4j ： 在complex基础上实现了最多分词(max-word)，但是还不成熟，还有很多需要改进的地方。ik ：? 针对Lucene全文检索优化的查询分析器IKQueryParser 8. 结论 个人觉得，可以在 mmseg4j 和 paoding 中选一个。关于这两个分词效果的对比，可以参考： http://blog.chenlb.com/2009/04/mmseg4j-max-word-segment-compare-with-paoding-in-effect.html 或者自己再包装一下，将 paoding 的词库更新检测做一个单独的模块实现，然后就可以在所有基于词库的分词算法之间无缝切换了。 ps，对不同的 field 使用不同的分词器是一个可以考虑的方法。比如 tag 字段，就应该使用一个最简单的分词器，按空格分词就可以了。 本文来自：http://blog.fulin.org/2009/08/lucene_chinese_analyzer_compare.html 上一篇：beta技术沙龙：大型网站的Lucene应用 ? 下一篇：如何对付网络爬虫 - JavaEye和网络爬虫斗争之路 编辑推荐 热点文章 ?搜索引擎antispam系统设计指南?什么叫全文检索-全文检索概念?刑侦角度看搜索?免费的晚餐-google技术学习?搜索引擎机器人研究报告?Antispam，反垃圾，反作弊 相关主题 最新文章 ?利用Sphinx实现实时全文检索 ?基于Sphinx构建准实时更新的分布式通用搜索引擎平台 ?尝试使用IKVM运行Lucene 2.9.0版 ?中文分词的整理 ?Apache Lucene 2.9的改进 ?Scrapy 轻松定制网络爬虫";
		String text = "最佳受孕时间";
		StringReader reader = new StringReader(text);
		SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer(
				Version.LUCENE_31);
		TokenStream ts = analyzer.tokenStream("content", reader);
		CharTermAttribute cta = ts.getAttribute(CharTermAttribute.class);
		while(ts.incrementToken())
		{
			System.out.println(cta.toString());
		}
		
//		TermAttribute ta = ts.getAttribute(TermAttribute.class);
//		Iterator<?> asdf = ts.getAttributeClassesIterator();
//		while(asdf.hasNext())
//			System.out.println(asdf.next());
//		Token ta = ts.getAttribute(Token.class);
//		while(ts.incrementToken())
//		{
//			System.out.println(ta.ge);
//		}
//		Token t = null;

//		Directory ram = new RAMDirectory();
//		IndexWriterConfig wconf = new IndexWriterConfig(Version.LUCENE_31,
//				analyzer);
//		IndexWriter writer = new IndexWriter(ram, wconf);
//
//		Document doc = new Document();
//		Field field = new Field("content", text, Field.Store.YES,
//				Field.Index.ANALYZED);
//
//		writer.addDocument(doc);
//		writer.close();
//
//		IndexSearcher searcher = new IndexSearcher(ram);
//		QueryParser parser = new QueryParser(Version.LUCENE_31, "content",
//				analyzer);
//		Query query = parser.parse("学习+软件");
//		System.out.println(query.toString());
//		TopDocs docs = searcher.search(query, 1);
//		System.out.println(docs.totalHits);
		
		// Document doc = new Document();

		// Document doc = new Document();
		// Field field = new Field("content", text, Field.Store.YES,
		// Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
		// doc.add(field);

	}
}
